package leetcode每日一题;

/**
 * 1. 问题描述
 *      字符串轮转。给定两个字符串s1和s2，请编写代码检查s2是否为s1旋转而成（比如，waterbottle是erbottlewat旋转后的字符串）。
 *
 * 2. 算法分析
 *      首先理解，什么是字符串轮转?
 *          即字符串的整体旋转，保持局部的相对顺序不变，举个例子：waterbottle/erbottlewat
 *
 *      如果同时拼接两个旋转之后的字符串 erbottle[waterbottle]wat，则原字符串一定出现在里面
 *
 *      1. 技巧 拼接旋转之后的字符串，然后判断即可
 *      2. 找到旋转点
 *
 * 3. 代码实现
 */
@SuppressWarnings("all")
public class 字符串旋转 {
    public static void main(String[] args) {
        String s1 = "waterbottle";
        String s2 = "erbottlewat";
        System.out.println(s1.substring(3, s1.length()));
        int i = s2.indexOf(s1.substring(3,s1.length()));
        System.out.println(i);
    }

    // 拼接字符串
    public boolean isFlipedString1(String s1, String s2) {
        int len1 = s1.length();
        int len2 = s2.length();
        if(len1 != len2) {
            return false;
        }
        String temp = s2 + s2;
        return temp.contains(s1);
    }

    // 通过indexOf找到旋转点
    public boolean isFlipedString2(String s1, String s2) {
        int len1 = s1.length();
        int len2 = s2.length();
        if(len1 == 0 && len2 == 0) {
            return true;
        }
        if(len1 == 0 || len2 == 0) {
            return false;
        }
        // 找到旋转点
        // 所谓的旋转点：如果第i个字符为旋转点(以s1为标准)之后的字符串出现在旋转之后的则为旋转点
        int point = 0;
        for(int i = 0; i < len1; i++) {
            String temp = s1.substring(i+1,len1);
            if(s2.indexOf(temp) != -1) {
                point = i;
                break;
            }
        }
        StringBuilder sb = new StringBuilder();
        sb.append(s1.substring(point+1,len1));
        sb.append(s1.substring(0,point+1));
        return sb.toString().equals(s2);
    }
}
